home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / gfx / misc / gnuplot-3.7src.lha / gnuplot-3.7src / gnuplot-3.7.lha / gnuplot-3.7 / docs / doc2ms.c < prev    next >
C/C++ Source or Header  |  1998-10-19  |  8KB  |  329 lines

  1. #ifndef lint
  2. static char *RCSid = "$Id: doc2ms.c,v 1.19 1998/06/18 14:59:11 ddenholm Exp $";
  3. #endif
  4.  
  5. /* GNUPLOT - doc2ms.c */
  6.  
  7. /*[
  8.  * Copyright 1986 - 1993, 1998   Thomas Williams, Colin Kelley
  9.  *
  10.  * Permission to use, copy, and distribute this software and its
  11.  * documentation for any purpose with or without fee is hereby granted,
  12.  * provided that the above copyright notice appear in all copies and
  13.  * that both that copyright notice and this permission notice appear
  14.  * in supporting documentation.
  15.  *
  16.  * Permission to modify the software is granted, but not the right to
  17.  * distribute the complete modified source code.  Modifications are to
  18.  * be distributed as patches to the released version.  Permission to
  19.  * distribute binaries produced by compiling modified sources is granted,
  20.  * provided you
  21.  *   1. distribute the corresponding source modifications from the
  22.  *    released version in the form of a patch file along with the binaries,
  23.  *   2. add special version identification to distinguish your version
  24.  *    in addition to the base release version number,
  25.  *   3. provide your name and address as the primary contact for the
  26.  *    support of your modified version, and
  27.  *   4. retain our contact information in regard to use of the base
  28.  *    software.
  29.  * Permission to distribute the released version of the source code along
  30.  * with corresponding source modifications in the form of a patch file is
  31.  * granted with same provisions 2 through 4 for binary distributions.
  32.  *
  33.  * This software is provided "as is" without express or implied warranty
  34.  * to the extent permitted by applicable law.
  35. ]*/
  36.  
  37. /*
  38.  * doc2ms.c  -- program to convert Gnuplot .DOC format to *roff -ms document
  39.  * From hlp2ms by Thomas Williams 
  40.  *
  41.  * Modified by Russell Lang, 2nd October 1989
  42.  * to make vms help level 1 and 2 create the same ms section level.
  43.  *
  44.  * Modified to become doc2ms by David Kotz (David.Kotz@Dartmouth.edu) 12/89
  45.  * Added table and backquote support.
  46.  *
  47.  * usage:  doc2ms [file.doc [file.ms]]
  48.  *
  49.  *   where file.doc is a VMS .DOC file, and file.ms will be a [nt]roff
  50.  *     document suitable for printing with nroff -ms or troff -ms
  51.  *
  52.  * typical usage for GNUPLOT:
  53.  *
  54.  *   doc2ms gnuplot.doc | tbl | eqn | troff -ms
  55.  *
  56.  * or
  57.  *
  58.  *   doc2ms gnuplot.doc | groff -ms -et >gnuplot.ps
  59.  */
  60.  
  61. #ifdef HAVE_CONFIG_H
  62. # include "config.h"
  63. #endif
  64.  
  65. #include "ansichek.h"
  66. #include "stdfn.h"
  67. #include "doc2x.h"
  68.  
  69. #define LINE_SKIP        3
  70.  
  71. void init __PROTO((FILE *));
  72. void convert __PROTO((FILE *, FILE *));
  73. void process_line __PROTO((char *, FILE *));
  74. void section __PROTO((char *, FILE *));
  75. void putms __PROTO((char *, FILE *));
  76. void putms_verb __PROTO((char *, FILE *));
  77. void finish __PROTO((FILE *));
  78.  
  79. static boolean intable = FALSE;
  80.  
  81. int main(argc, argv)
  82. int argc;
  83. char **argv;
  84. {
  85.     FILE *infile;
  86.     FILE *outfile;
  87.     infile = stdin;
  88.     outfile = stdout;
  89.     if (argc > 3) {
  90.     fprintf(stderr, "Usage: %s [infile [outfile]]\n", argv[0]);
  91.     exit(EXIT_FAILURE);
  92.     }
  93.     if (argc >= 2) {
  94.     if ((infile = fopen(argv[1], "r")) == (FILE *) NULL) {
  95.         fprintf(stderr, "%s: Can't open %s for reading\n",
  96.             argv[0], argv[1]);
  97.         exit(EXIT_FAILURE);
  98.     }
  99.     }
  100.     if (argc == 3) {
  101.     if ((outfile = fopen(argv[2], "w")) == (FILE *) NULL) {
  102.         fprintf(stderr, "%s: Can't open %s for writing\n",
  103.             argv[0], argv[2]);
  104.         exit(EXIT_FAILURE);
  105.     }
  106.     }
  107.     init(outfile);
  108.     convert(infile, outfile);
  109.     finish(outfile);
  110.     exit(EXIT_SUCCESS);
  111. }
  112.  
  113.  
  114. void init(b)
  115. FILE *b;
  116. {
  117.     /* in nroff, increase line length by 8 and don't adjust lines */
  118.     (void) fputs(".if n \\{.nr LL +8m\n.na \\}\n\
  119. .nr PO +0.3i\n\
  120. .so titlepag.ms\n\
  121. .pn 1\n\
  122. .bp\n\
  123. .ta 1.5i 3.0i 4.5i 6.0i 7.5i\n\
  124. \\&\n.sp 3\n.PP\n", b);
  125.  
  126.     /* following line commented out by rjl
  127.        (void) fputs(".so intro\n",b);
  128.      */
  129. }
  130.  
  131.  
  132. void convert(a, b)
  133. FILE *a, *b;
  134. {
  135.     static char line[MAX_LINE_LEN+1];
  136.  
  137.     while (get_line(line, sizeof(line), a)) {
  138.     process_line(line, b);
  139.     }
  140. }
  141.  
  142. void process_line(line, b)
  143. char *line;
  144. FILE *b;
  145. {
  146.     switch (line[0]) {        /* control character */
  147.     case '?':{            /* interactive help entry */
  148.         break;        /* ignore */
  149.     }
  150.     case '@':{            /* start/end table */
  151.         if (intable) {
  152.         (void) fputs(".TE\n.KE\n", b);
  153.         (void) fputs(".EQ\ndelim off\n.EN\n\n", b);
  154.         intable = FALSE;
  155.         } else {
  156.         (void) fputs("\n.EQ\ndelim $$\n.EN\n", b);
  157.         (void) fputs(".KS\n.TS\ncenter box tab (@) ;\n", b);
  158.         /* moved to gnuplot.doc by RCC
  159.            (void) fputs("c c l .\n", b);
  160.          */
  161.         intable = TRUE;
  162.         }
  163.         /* ignore rest of line */
  164.         break;
  165.     }
  166.     case '^':{            /* html table entry */
  167.         break;        /* ignore */
  168.     }
  169.     case '#':{            /* latex table entry */
  170.         break;        /* ignore */
  171.     }
  172.     case '%':{            /* troff table entry */
  173.         if (intable)
  174.         (void) fputs(line + 1, b);    /* copy directly */
  175.         else
  176.         fprintf(stderr, "error: %% line found outside of table\n");
  177.         break;
  178.     }
  179.     case '\n':            /* empty text line */
  180.     case ' ':{            /* normal text line */
  181.         if (intable)
  182.         break;        /* ignore while in table */
  183.         switch (line[1]) {
  184.         case ' ':{
  185.             /* verbatim mode */
  186.             fputs(".br\n", b);
  187.             putms_verb(line + 1, b);
  188.             fputs(".br\n", b);
  189.             break;
  190.         }
  191.         case '\'':{
  192.             fputs("\\&", b);
  193.             putms(line + 1, b);
  194.             break;
  195.         }
  196.         case '.':{        /* hide leading . from ms */
  197.             fputs("\\&", b);
  198.             putms(line + 1, b);
  199.             break;
  200.         }
  201.         default:{
  202.             if (line[0] == '\n')
  203.             putms(line, b);        /* handle totally blank line */
  204.             else
  205.             putms(line + 1, b);
  206.             break;
  207.         }
  208.         break;
  209.         }
  210.         break;
  211.     }
  212.     default:{
  213.         if (isdigit((int)line[0])) {    /* start of section */
  214.         if (!intable)    /* ignore while in table */
  215.             section(line, b);
  216.         } else
  217.         fprintf(stderr, "unknown control code '%c' in column 1\n",
  218.             line[0]);
  219.         break;
  220.     }
  221.     }
  222. }
  223.  
  224.  
  225. /* process a line with a digit control char */
  226. /* starts a new [sub]section */
  227.  
  228. void section(line, b)
  229. char *line;
  230. FILE *b;
  231. {
  232.     static char string[MAX_LINE_LEN+1];
  233.     int sh_i;
  234.     static int old = 1;
  235.  
  236.  
  237.     (void) sscanf(line, "%d %[^\n]s", &sh_i, string);
  238.  
  239.     (void) fprintf(b, ".sp %d\n", (sh_i == 1) ? LINE_SKIP : LINE_SKIP - 1);
  240.  
  241.     if (sh_i > old) {
  242.     do
  243.         if (old != 1)    /* this line added by rjl */
  244.         (void) fputs(".RS\n.IP\n", b);
  245.     while (++old < sh_i);
  246.     } else if (sh_i < old) {
  247.     do
  248.         if (sh_i != 1)    /* this line added by rjl */
  249.         (void) fputs(".RE\n.br\n", b);
  250.     while (--old > sh_i);
  251.     }
  252.     /* added by dfk to capitalize section headers */
  253.     if (islower((int)string[0]))
  254.     string[0] = toupper(string[0]);
  255.  
  256.     /* next 3 lines added by rjl */
  257.     if (sh_i != 1)
  258.     (void) fprintf(b, ".NH %d\n%s\n.sp 1\n.LP\n", sh_i - 1, string);
  259.     else
  260.     (void) fprintf(b, ".NH %d\n%s\n.sp 1\n.LP\n", sh_i, string);
  261.     old = sh_i;
  262.  
  263.     (void) fputs(".XS\n", b);
  264.     (void) fputs(string, b);
  265.     (void) fputs("\n.XE\n", b);
  266. }
  267.  
  268. void putms(s, file)
  269. char *s;
  270. FILE *file;
  271. {
  272.     static boolean inquote = FALSE;
  273.  
  274.     while (*s != NUL) {
  275.     switch (*s) {
  276.     case '`':{        /* backquote -> boldface */
  277.         if (inquote) {
  278.             fputs("\\fR", file);
  279.             inquote = FALSE;
  280.         } else {
  281.             fputs("\\fB", file);
  282.             inquote = TRUE;
  283.         }
  284.         break;
  285.         }
  286.     case '\\':{        /* backslash */
  287.         fputs("\\\\", file);
  288.         break;
  289.         }
  290.     case '\'':{        /* single quote */
  291.         fputs("\\&'", file);
  292.         break;
  293.         }
  294.     default:{
  295.         fputc(*s, file);
  296.         break;
  297.         }
  298.     }
  299.     s++;
  300.     }
  301. }
  302.  
  303. /*
  304.  * convert a verbatim line to troff input style, i.e. convert "\" to "\\"
  305.  * (added by Alexander Lehmann 01/30/93)
  306.  */
  307.  
  308. void putms_verb(s, file)
  309. char *s;
  310. FILE *file;
  311. {
  312.     while (*s != '\0') {
  313.     if (*s == '\\') {
  314.         fputc('\\', file);
  315.     }
  316.     fputc(*s, file);
  317.     s++;
  318.     }
  319. }
  320.  
  321. void finish(b)            /* spit out table of contents */
  322. FILE *b;
  323. {
  324.     (void) fputs(".pn 1\n", b);
  325.     (void) fputs(".ds RH %\n", b);
  326.     (void) fputs(".af % i\n", b);
  327.     (void) fputs(".bp\n.PX\n", b);
  328. }
  329.